package
{
	import flash.desktop.NativeApplication;
	import flash.display.Sprite;
	import flash.errors.IllegalOperationError;
	import flash.events.InvokeEvent;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	/**
	 * Copyright設定用のスクリプトファイル.
	 * 
	 * コマンドライン引数に実行対象ディレクトリorファイルを指定することで、
	 * フィルタに一致するファイルを再帰的にCOPYRIGHTを付与する。
	 * 
	 * 注意:置き換えではなく冒頭に挿入するので2度実行すると重複コードが挿入されます。
	 *
	 * @author hikaruworld
	 * 
	 */	
	public class Copyright extends Sprite
	{
		/** フィルター */
		private static const includeFilename:Array = [/*".mxml", */".as"];
		/** 
		 * 冒頭への挿入文字列
		 * TODO 気が向きゃ置換を実装
		 */
		private static const COPYRIGHT:String = "" +
			"////////////////////////////////////////////////////////////////////////////////\n" +
			"//\n" +
			"//  FLEX USER GROUP HOKURIKU\n" +
			"//  Copyright 2009 Flex User Group Hokuriku\n" +
			"//  All Rights Reserved.\n" +
			"//\n" +
			"//  NOTICE: Flex User Group Hokuriku permits you to use,\n"
			"//  modify, and distribute this file\n"
			"//  in accordance with the terms of the license agreement accompanying it.\n"
			"//\n"
			"////////////////////////////////////////////////////////////////////////////////\n"
		public function Copyright()
		{
			NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, addCopyrightHandler);
			super();
		}
		public function addCopyrightHandler(event:InvokeEvent):void
		{
			if (event.arguments.length != 1)
			{
				throw new ArgumentError("引数が正しく設定されていないため処理出来ません.");
			}
			var filePath:String = event.arguments[0];
			
			var file:File = File.desktopDirectory.resolvePath(filePath);
			
			if (!file.exists)
			{
				throw new IllegalOperationError("処理対象のファイル/ディレクトリが存在しません");
			}
			
			trace(file.nativePath + "::以下のファイルに対してcopyright処理を実行します。");
			
			this.add(file);			
		}
		public function add(tmpFile:File):void
		{
			// 隠しファイルやシンボリックリンクは無視
			if (tmpFile.isHidden || tmpFile.isSymbolicLink)
			{
				trace(tmpFile.nativePath + "::は処理対象外です");
				return;
			}
			if (tmpFile.isDirectory)
			{
				trace(tmpFile.nativePath + "::は処理対象外です");
				for (var i:int=0; i < tmpFile.getDirectoryListing().length; i++)
				{
					var f:File = tmpFile.getDirectoryListing()[i];
					this.add(f);
				}
				return;
			}
			var contains:Boolean = includeFilename.some(function callback(item:*, index:int, array:Array):Boolean
			{
				var s:String = item as String;
				return tmpFile.name.indexOf(s) > -1;
			},this);
			
			if (!contains)
			{
				trace(tmpFile.nativePath + "::は処理対象外です");
				return;
			}
			
			// 実処理
			var fs:FileStream = new FileStream();
			try
			{
				trace("Execute::" + tmpFile.nativePath);
				fs.open(tmpFile, FileMode.READ);
				var content:String = COPYRIGHT + fs.readUTFBytes(fs.bytesAvailable);
				fs.close();
				// positionの指定を行ってもなぜか末尾書き込みになってしまうので再度開き直す
				fs.open(tmpFile, FileMode.UPDATE);
				fs.position = 0;
				fs.writeUTFBytes(content);
				fs.close();
			}
			catch (e:Error)
			{
				trace(e.getStackTrace());
				throw new IllegalOperationError("エラーが発生したため処理できませんでした");
			}
		}
	}
}